package com.sytc.camera.test;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Base64;

/**
 * 512*512 解析代码
 */
public class RawImageDisplayApp extends Application {

    @Override
    public void start(Stage primaryStage) {
        // 设置 RAW 图像文件路径
//        String imagePath = "E:/project/USBImgProcess系统文件夹/image/image_14.raw";
        String imagePath = "E:\\project\\sytc_camera\\image\\image_14.raw";


        // 设定图像的尺寸
        int width = 512;
        int height = 512;

        // 从文件读取图像数据
        byte[] imageData = readRawImage(imagePath, width, height);

        // 将 RAW 数据转换为 JavaFX 图像
        Image image = createImageFromRawData(imageData, width, height);

        // 使用 ImageView 来展示图像
        ImageView imageView = new ImageView(image);

        // 创建布局并设置场景
        StackPane root = new StackPane();
        root.getChildren().add(imageView);
        Scene scene = new Scene(root, 800, 600);

        primaryStage.setTitle("RAW Image Display");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // 读取 RAW 图像数据文件
    private byte[] readRawImage(String filePath, int width, int height) {
        File file = new File(filePath);
        byte[] imageData = new byte[width * height]; // 为 512x512 图像分配空间

        try (FileInputStream fis = new FileInputStream(file)) {
            // 读取文件内容到 imageData 数组
            fis.read(imageData);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return imageData;
    }

    // 将 RAW 数据转换为 JavaFX 图像
    private Image createImageFromRawData(byte[] data, int width, int height) {
        // 假设 RAW 数据是灰度图，每个像素一个字节
        int[] pixels = new int[width * height];

        // 将每个灰度值转换为 RGB 值
        for (int i = 0; i < pixels.length; i++) {
            int pixel = data[i] & 0xFF;  // 灰度值 (0-255)
            pixels[i] = (pixel << 16) | (pixel << 8) | pixel;  // 转换为 RGB 格式
        }

        // 创建一个包含图像像素数据的 JavaFX 图像
        return new Image("data:image/png;base64," + encodeToBase64(pixels, width, height));
    }

    // 这一步是将像素数据转换为 Base64 编码的 PNG（可以根据需求调整）
    private String encodeToBase64(int[] pixels, int width, int height) {
        // 创建一个 BufferedImage 对象来存储图像
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // 将像素数据写入 BufferedImage
        bufferedImage.setRGB(0, 0, width, height, pixels, 0, width);

        // 将 BufferedImage 转换为 PNG 格式的字节数组
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            ImageIO.write(bufferedImage, "PNG", baos);
            byte[] imageBytes = baos.toByteArray();

            // 将字节数组转换为 Base64 编码的字符串
            return Base64.getEncoder().encodeToString(imageBytes);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
